<?php
    class Vaga extends BaseModel
    {
    	
        protected $vagaid;
        protected $cargoid;
        protected $contratoid;
        protected $lotacaoid;
        protected $ativa;
		protected $statusid;
        
		const tablename = 'vaga';
		const tablekey = 'vagaid';
		const tablesequence = 'vaga_vagaid_seq';
		
        public function __construct( $objectid = null, $cargoid = null, $contratoid = null )
        {
            
        	$id = NULL;
        	
            if( $objectid )
            	$id = $objectid;
            elseif ( $cargoid && $contratoid ) {
            	$sql = "SELECT vagaid FROM vaga WHERE cargoid = $cargoid AND contratoid = $contratoid LIMIT 1";
            	$result = TUtils::CriarResultSet($sql);
            	$id = $result->vagaid;
            }
            	
            parent::__construct( $id );
                
        }
        
        public function getTotalPorCargoContrato(){

        	$sql  = "SELECT count(*) as total FROM vaga WHERE contratoid = " . $this->contratoid;
		    $sql .= " AND cargoid = " . $this->cargoid; 
		    $result = TUtils::CriarResultSet($sql);
		    $objeto = pg_fetch_object($result);
		    
		    return $objeto->total;
        	
        }
        	
        public function listarPorContrato( $criterio = array())
        {        	     		
            if (empty($criterio)){
                $criterio['precondicao'] = 'contratoid = 0';
            }
                        
            $view = new ViewVagasContrato();
            return $view->listar($criterio);
        }
        
        public function excluirPorCargoContrato( $cargoid, $contratoid )
        {
        	
			$sql = "DELETE FROM " . self::tablename . " WHERE cargoid = $cargoid AND contratoid = $contratoid";
        	pg_query(conexao::Conectar(), $sql);
	            
        }
        
    	public function desalocar( $vagaid )
        {
        	$sql = "UPDATE " . self::tablename . " SET lotacaoid = NULL WHERE " . self::tablekey . " in (";
            for($i = 0; $i < count($vagaid); $i++)
            {
                $sql .= $vagaid[$i];
                if ($i < count($vagaid)-1)
                { $sql .= ","; }
                else
                { $sql .= ")"; }
            }
            
            pg_query(conexao::Conectar(), $sql) or die ("Erro ao excluir.");
        }
        
	    public function excluirBlocoContrato($objetoid, $contratoid) {
			$sql = "DELETE FROM " . self::tablename . " WHERE contratoid = $contratoid AND cargoid IN (";
			for($i = 0; $i < count ( $objetoid ); $i ++) {
				$sql .= $objetoid [$i];
				if ($i < count ( $objetoid ) - 1) {
					$sql .= ",";
				} else {
					$sql .= ")";
				}
			}
			pg_query ( conexao::Conectar (), $sql ) or die ( "Erro ao excluir." );
		}
        
    	public static function ativarBloco( $bloco, $status )
        {
        	$sql = "UPDATE " . self::tablename . " SET ativa = $status WHERE " . self::tablekey . " in (";
            for($i = 0; $i < count($bloco); $i++)
            {
                $sql .= $bloco[$i];
                if ($i < count($bloco)-1)
                { $sql .= ","; }
                else
                { $sql .= ")"; }
            }
            
            pg_query(conexao::Conectar(), $sql) or die ("Erro ao excluir.");
        }
        
        public function desalocarPorVagaLotacao( $qtd ){
        	
        	if ( $this->cargoid === NULL )
        		throw new Exception("Por favor, informe o cargo.");
        	if ( $this->lotacaoid === NULL )
        		throw new Exception("Por favor, informe a lotação.");
			if ( !is_numeric ( $qtd ) )
        		throw new Exception("Quantidade inválida.");
        		
        	$vaga = $this->vagaid;
        	$lotacao = $this->lotacaoid;
        	
        	$sql = "SELECT distinct(" . $this->getTableKey() . ") FROM " . $this->getTableName() . " WHERE cargoid = " . $this->cargoid . " AND lotacaoid = " . $this->lotacaoid . " AND ativa = FALSE AND contratoid = " . $this->contratoid . " LIMIT $qtd";
        	
        	$result = TSqlSelect::customSelect( $sql );
        	
        	if ( pg_num_rows( $result ) <> $qtd )
        		throw new Exception("Por favor, informe uma quantidade válida.");
        	
        	$ids = TSqlSelect::arrayToString( pg_fetch_all($result), $this->getTableKey() );
        	
        	$sql = "UPDATE " . self::tablename . " SET lotacaoid = NULL WHERE " . self::tablekey . " in ($ids)";
        	
        	pg_query(conexao::Conectar(), $sql) or die ("Erro ao desalocar.");
        	
        }
        
        public function encaminharParaTerceirizada(){
        	$this->statusid = Status::Vaga_AContratar;
         	$this->ativa = true;
         	$this->salvar();
        }
        
        public function resetarVaga( $resetarLotacao = FALSE ){
        	$this->statusid = Status::Vaga_AContratar;
         	$this->ativa = FALSE;
         	if ($resetarLotacao == TRUE) {
         		$this->lotacaoid = NULL;
         	}
         	$this->salvar();
        }
        
        /**
         * @return Contrato
         */
        public function getContrato(){
        	$contrato = new Contrato($this->contratoid);
        	return $contrato;
        }
        
        /**
         * @return Cargo
         */
     	public function getCargo(){
        	$cargo = new Cargo($this->cargoid);
        	return $cargo;
        }
        
        /**
         * @return Lotacao
         */
    	public function getLotacao(){
        	$lot = new Lotacao($this->lotacaoid);
        	return $lot;
        }
        
        /**
         * @return CandidatoVaga
         */               
        public function getCandidatoVagaAtivo()
        {
        	$candidatoVaga = new CandidatoVaga();
        	$candidatoVaga->candidatoAtivo($this->vagaid);
        	return $candidatoVaga;
        }
        
        public function hasCandidato()
        {
            if ($this->getCandidatoVagaAtivo()->getTableKeyValue()) {
                return TRUE;
            }
            return FALSE;
        }
        
        public function getSelecaoAtual()
        {
            $selecao = new Selecao();
            
            $criterio = array();
            $criterio['precondicao'] = 'ativo IS TRUE';
            $criterio['campo'] = 'vagaid';
            $criterio['operador'] = '=';
            $criterio['valor'] = $this->vagaid;
            $criterio['limit'] = 1;
            $criterio['order'] = 'DESC';
            $criterio['orderBy'] = 'dataselecao';
            
            $result = $selecao->listar( $criterio );
            
            if ( pg_num_rows( $result ) == 1 ){
                $result = pg_fetch_object( $result );
                $selecao = new Selecao( $result->selecaoid );
            }
            return $selecao;
        }
        
        public function hasSelecaoAtiva()
        {
            return ($this->getSelecaoAtual()->getTableKeyValue()) ? TRUE : FALSE;
        }
        
        public function encaminharCandidatoPostoTrabalho( $candidatovagaid, $observacao )
        {
            // Pré-Condições ----------------------------------------------------------------------
            
            if ( !$this->isVisible( $candidatovagaid, Operacao::VINCULACAO_ENCAMINHARPARAPOSTODETRABALHO ) ){
                throw new Exception( 'Permissão insuficiente' );
            }
                
            // Fim Pré-Condições ------------------------------------------------------------------
            
            $candidatoVaga = new CandidatoVaga( $candidatovagaid );
            $candidatoVaga->inserirHistorico( Status::Candidato_EncaminhadoPostoTrabalho, $observacao );
        }
        
        public function finalizarVinculacao( $candidatovagaid, $observacao )
        {
            // Pré-Condições ----------------------------------------------------------------------
            
            if ( !$this->isVisible( $candidatovagaid, Operacao::VINCULACAO_FINALIZARCONTRATACAO ) ){
                throw new Exception( 'Permissão insuficiente' );
            }
                
            // Fim Pré-Condições ------------------------------------------------------------------
            
            $candidatoVaga = new CandidatoVaga( $candidatovagaid );
            $candidatoVaga->inserirHistorico( Status::Candidato_ContratacaoFinalizada, $observacao );
        }
        
        public function isVisible( $candidatovagaid, $operacao )
        {
            global $usuario, $pfcid;
            
            $candidatoVaga = new CandidatoVaga( $candidatovagaid );
            $historico = $candidatoVaga->getHistoricoAtual();
            $status = $historico->statusid;
            
            if ( !$usuario->isAuthorized( $operacao ) ){
                return FALSE;
            }
            
            if ( $this->ativa == 'f' ){
                return FALSE;
            }
            
            switch( $operacao ){
                case Operacao::VINCULACAO_ENCAMINHARPARAPOSTODETRABALHO:
                    
                    $sql = "SELECT * FROM candidatovagahistorico
							WHERE 
								candidatovagaid = " . $candidatoVaga->candidatovagaid . " AND 
								statusid = " . Status::Candidato_EncaminhadoPostoTrabalho;
	
	                if ( 
	                        $status == Status::Candidato_Contratado AND 
	                        pg_num_rows( TSqlSelect::customSelect( $sql ) ) == 0 
                        ){
                        return TRUE;
                    }
                    break;
                    
                case Operacao::VINCULACAO_FINALIZARCONTRATACAO:
                    if ( $status == Status::Candidato_EncaminhadoPostoTrabalho ){
                        return TRUE;
                    }
                    break;
                    
            }
            return FALSE;
        }
        
        /**
         * Considerando que os ids são de vagas do mesmo cargo e contrato
         * @param $ids array 
         * @see model/BaseModel#excluirGrupo($ids)
         */
        public function excluirGrupo( $ids )
        {
        	try {
        	   pg_query( conexao::Conectar(), 'begin' );
        	     	
    	        $vaga = new Vaga($ids[0]);                	               	    
        	    $qtdBanco = $vaga->getTotalPorCargoContrato();
        	    $qtdVagas = count($ids);
    	        
        	    //Exclui os salarios
        	    if ($qtdVagas == $qtdBanco){
        	         $sql = 'DELETE FROM ' . Salario::tablename . ' WHERE cargoid ='.$vaga->cargoid.' AND contratoid = '.$vaga->contratoid ;
        	         TSqlSelect::customSelect( $sql );
        	    }
                     	    
               parent::excluirGrupo( $ids );        	    
        	   pg_query( conexao::Conectar(), 'commit' );
            } catch ( exception $e ){
               pg_query( conexao::Conectar(), 'rollback' );
                throw new Exception( $e->getMessage() );
            }
        }
        
        /**
         * Retorna o status da vaga
         * @return Status
         */
        public function getStatus(){
            return new Status($this->statusid);
        }
    }
?>